package util.http;

import junit.framework.Assert;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.util.List;

/**
 * Http 프로토콜을 사용하는 서버와 연결하는 클래스
 * @author  : BoxResin
 * @version : 1.0
 */
abstract class HttpConnector
{
	protected DefaultHttpClient _client; // Http 클라이언트
	private String _address;      // 서버의 주소

	/**
	 * 서버의 주소를 전달받는 생성자
	 * @param address : 서버의 주소
	 */
	public HttpConnector(String address)
	{
		_client = new DefaultHttpClient();
		_address = address;
	}

	/**
	 * 서버에 매개변수를 전달하고 결과를 반환하는 메서드
	 * @param params : 서버에 전달할 매개변수
	 * @return       : 서버의 응답 (주로 HTML 문서)
	 * @throws java.io.IOException
	 */
	public abstract String request(String... params) throws IOException;

	/**
	 * request 메서드의 매개변수가 올바른지 검사하는 메서드
	 * @param params : request 메서드로 전달된 매개변수
	 */
	protected void _checkRequestParams(String[] params)
	{
		Assert.assertTrue("매개변수는 반드시 짝수개여야 합니다.", params.length % 2 == 0);
	}

	/**
	 * 실제로 서버에 매개변수를 전달하는 메서드
	 * @param request : 요청할 URL
	 * @return        : 서버의 응답
	 * @throws java.io.IOException
	 */
	protected String _request(HttpUriRequest request) throws IOException
	{
		HttpResponse response = _client.execute(request);
		HttpEntity entity = response.getEntity();

		if (entity != null)
			return EntityUtils.toString(entity);
		else
			return null;
	}

	/**
	 * 쿠키를 가져오는 메서드
	 * @return : 쿠키
	 */
	public List<Cookie> getCookies()
	{
		CookieStore cookieStore = _client.getCookieStore();
		return cookieStore.getCookies();
	}

	// 필드 접근 메서드
	public String getAddress()
	{
		return _address;
	}

	public void setAddress(String address)
	{
		_address = address;
	}
}